package cn.tk.model.pojo;

import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;

/**
* Created by denglw on 2017-12-01.<br/>
* Desc:  接口返回结果对象
*/
@Getter @Setter @NoArgsConstructor
public final class ResultModel<T> {
    /**
     * 返回是否成功
     */
    private boolean success;

    /**
     * 返回状态码: 可以是http状态码，也可以自定义状态码
     */
    private int code;

    /**
     * 返回的具体说明信息
     */
    private String message;

    /**
     * 业务数据
     */
    private T data;

    private ResultModel(boolean success, int code, String message, T data) {
        this.success = success;
        this.code = code;
        this.message = message;
        this.data = data;
    }

    /**
     * 返回成功的访问结果，状态码默认为200.<br/>
     * @param data 业务数据
     * @param <T> 泛型
     */
    public static<T> ResultModel<T> success(T data) {
        return new ResultModel<>(true, 200, "OK", data);
    }

    /**
     * 返回成功的访问结果，状态码默认为200.<br/>
     * @param message 说明信息
     * @param data 业务数据
     * @param <T> 泛型
     */
    public static<T> ResultModel<T> success(String message, T data) {
        return new ResultModel<>(true, 200, message, data);
    }

    /**
     * 返回成功的访问结果.<br/>
     * @param code 成功状态码
     * @param message 说明信息
     * @param data 业务数据
     * @param <T> 泛型
     */
    public static<T> ResultModel<T> success(int code, String message, T data) {
        return new ResultModel<>(true, code, message, data);
    }

    /**
     * 返回失败的访问结果，状态码默认为500.<br/>
     * @param message 失败信息
     */
    public static<T> ResultModel<T> failure(String message) {
        return new ResultModel<>(false, 500, message, null);
    }

    /**
     * 返回失败的访问结果.<br/>
     * @param code 失败状态码
     * @param message 失败信息
     */
    public static<T> ResultModel<T> failure(int code, String message) {
        return new ResultModel<>(false, code, message, null);
    }

    /**
     * 返回失败的访问结果.<br/>
     * @param error 错误信息枚举
     */
    public static<T> ResultModel<T> failure(ResultError error) {
        return new ResultModel<>(false, error.getCode(), error.getMessage(), null);
    }

}
